ホームに戻る
出典 :
関連 :
目次 :
UIElement.Visibility プロパティ
UI要素の可視性を司るプロパティ。取得( get )および設定( set )が可能である。
Visibility 列挙体として宣言されており、以下の3つの値をとる。

補足
Visibility は依存関係プロパティであるため、
データバインディングのターゲットとすることが可能である。
また、Visibility が変更されると、IsVisible プロパティが連動して変化する。
これは値の取得のみが可能で、Visibility == Visible 時は true 、それ以外は false となる。
注意が必要な点(データバインディング)
UIイベントハンドラ(ボタンクリックなど)内で Visibility に紐づくソース値を変更した場合、アプリケーションに処理が戻るまでは表示が更新されない。
(これは Visibility に限らず、ZIndex などの表示に関連する他のプロパティも同様である。)

この場合、時間のかかる処理をハンドラ内で同期的に実行せず、非同期処理とすればよい。
( await でアプリケーションに処理を戻す。)
(データバインディングを用いず、プロパティを直接操作した場合も同様?要調査)
修正前のコード(抜粋)
/// <summary>
/// ボタンクリック時の処理
/// </summary>
private void Button_Click( object sender, RoutedEventArgs e ) =>
ClickHandler_Core();
/// <summary>
/// ボタンクリック時の処理(主処理)
/// </summary>
private void ClickHandler_Core()
{
// Visibility を更新
ViewModel.LabelVisibility.Value = Visibility.Visible;
// (この時点で表示が変わっていてほしい)
// 時間がかかる処理
HeavyProc();
// (実際に表示が変化するのは HeavyProc() の完了後)
}
修正後のコード(抜粋)
/// <summary>
/// ボタンクリック時の処理
/// </summary>
private void Button_Click( object sender, RoutedEventArgs e ) =>
ClickHandler_Core();
/// <summary>
/// ボタンクリック時の処理(主処理) ⇒ 非同期( async )化
/// </summary>
private async Task ClickHandler_Core()
{
// Visibility を更新
ViewModel.LabelVisibility.Value = Visibility.Visible;
// 時間がかかる処理 ⇒ await で呼び元に処理を戻す
await Task.Run( () => HeavyProc() );
// (HeavyProc() 開始直後に表示が変化する)
}